#include "can.h"

void can_SendCmd(__IO uint8_t *cmd, uint8_t len)
{
    DL_MCAN_TxBufElement txMsg;
    __IO uint8_t i = 0, j = 0, k = 0, l = 0, packNum = 0;
    uint8_t bufferIndex = 0; // 使用的发送缓冲区索引

    // 计算ID部分和功能码部分的数据长度
    j = len - 2;

    // 发送数据
    while(i < j)
    {
        // 数据个数
        k = j - i;

        // 配置消息头
        /* 扩展ID: 命令字节0作为高8位，包序号作为低8位 */
        txMsg.id = ((uint32_t)((((uint32_t)cmd[0] << 8) | (uint32_t)packNum)) );
        /* 数据帧 */
        txMsg.rtr = 0U;
        /* 29-bit扩展标识符 */
        txMsg.xtd = 1U;
        /* ESI bit in CAN FD format depends only on error passive flag */
        txMsg.esi = 0U;
        /* CAN FD frames transmitted with bit rate switching */
        txMsg.brs = 0U;
        /* Frame transmitted in CAN format (not CAN FD) */
        txMsg.fdf = 0U;
        /* Store Tx events */
        txMsg.efc = 1U;
        /* Message Marker */
        txMsg.mm = packNum;
        // 第一个数据字节固定为cmd[1]
        txMsg.data[0] = cmd[1];

        // 小于8字节数据
        if(k < 8)
        {
            for(l = 0; l < k; l++, i++) 
            { 
                txMsg.data[l + 1] = cmd[i + 2]; 
            }
            txMsg.dlc = k + 1;
        }
        // 大于8字节数据，分包发送，每包数据最多发送8个字节
        else
        {
            for(l = 0; l < 7; l++, i++) 
            { 
                txMsg.data[l + 1] = cmd[i + 2]; 
            }
            txMsg.dlc = 8;
        }

        // 发送数据
        // 将消息写入发送缓冲区
        DL_MCAN_writeMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, bufferIndex, &txMsg);
        
        // 请求发送
        DL_MCAN_TXBufAddReq(MCAN0_INST, bufferIndex);
        
        // 等待发送完成（可选，根据实际需求决定是否需要等待）
        // 这里可以添加发送完成检查或超时机制
        
        // 记录发送的第几包的数据
        ++packNum;
    }
}

volatile uint32_t delay_times = 0;
void SysTick_Handler(void)
{
	if(delay_times != 0)
	{
		delay_times--;
	}
}
void delay_ms(uint32_t ms)
{
    delay_times = ms;
    while( delay_times != 0 );
}
